package com.smart.community.property.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.smart.community.commons.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * 燃气费实体类
 * 
 * 严格按照《Java后端SpringBoot代码开发规范.md》Entity规范实现：
 * - 继承BaseEntity：获得标准字段（id、createTime、updateTime、createBy、updateBy、version、deleted）
 * - 功能单一原则：Entity类必须是单纯的数据库字段映射的Bean对象，功能必须单一
 * - 禁止枚举类：所有枚举字段都使用String类型存储，避免使用枚举类
 * - 禁止工具方法：只保留基本的getter/setter方法，禁止添加工具方法
 * - 完整注释：所有字段都有完整的JavaDoc注释
 * - 字段映射：使用@TableField注解正确映射数据库字段
 * 
 * @author Wu.Liang
 * @since 2024-12-21
 * @version 3.0.0 - 根据新Entity规范调整
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sc_gas_fee")
@Schema(description = "燃气费实体")
public class GasFee extends BaseEntity {
    private static final long serialVersionUID = 1L;

    /**
     * 用户ID
     */
    @Schema(description = "用户ID")
    @NotNull(message = "用户ID不能为空")
    @TableField("user_id")
    private Long userId;

    /**
     * 社区ID
     */
    @Schema(description = "社区ID")
    @NotNull(message = "社区ID不能为空")
    @TableField("community_id")
    private Long communityId;

    /**
     * 楼栋ID
     */
    @Schema(description = "楼栋ID")
    @TableField("building_id")
    private Long buildingId;

    /**
     * 单元ID
     */
    @Schema(description = "单元ID")
    @TableField("unit_id")
    private Long unitId;

    /**
     * 房户ID
     */
    @Schema(description = "房户ID")
    @NotNull(message = "房户ID不能为空")
    @TableField("household_id")
    private Long householdId;

    /**
     * 计费周期
     */
    @Schema(description = "计费周期")
    @TableField("billing_period")
    private String billingPeriod;

    /**
     * 燃气表编号
     */
    @Schema(description = "燃气表编号")
    @TableField("meter_no")
    private String meterNo;

    /**
     * 上次读数
     */
    @Schema(description = "上次读数")
    @TableField("previous_reading")
    private BigDecimal previousReading;

    /**
     * 本次读数
     */
    @Schema(description = "本次读数")
    @TableField("current_reading")
    private BigDecimal currentReading;

    /**
     * 用气量
     */
    @Schema(description = "用气量")
    @TableField("usage_amount")
    private BigDecimal usageAmount;

    /**
     * 单价
     */
    @Schema(description = "单价")
    @TableField("unit_price")
    private BigDecimal unitPrice;

    /**
     * 费用金额
     */
    @Schema(description = "费用金额")
    @NotNull(message = "费用金额不能为空")
    @DecimalMin(value = "0.01", message = "费用金额必须大于0")
    @TableField("amount")
    private BigDecimal amount;

    /**
     * 支付状态（0-未支付，1-已支付，2-逾期，3-部分支付）
     */
    @Schema(description = "支付状态：0-未支付，1-已支付，2-逾期，3-部分支付")
    @TableField("payment_status")
    private Integer paymentStatus;

    /**
     * 已支付金额
     */
    @Schema(description = "已支付金额")
    @TableField("paid_amount")
    private BigDecimal paidAmount;

    /**
     * 未支付金额
     */
    @Schema(description = "未支付金额")
    @TableField("unpaid_amount")
    private BigDecimal unpaidAmount;

    /**
     * 支付金额
     */
    @Schema(description = "支付金额")
    @TableField("payment_amount")
    private BigDecimal paymentAmount;

    /**
     * 支付时间
     */
    @Schema(description = "支付时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("payment_time")
    private LocalDateTime paymentTime;

    /**
     * 支付方式（1-现金，2-微信，3-支付宝，4-银行卡）
     */
    @Schema(description = "支付方式：1-现金，2-微信，3-支付宝，4-银行卡")
    @TableField("payment_method")
    private Integer paymentMethod;

    /**
     * 抄表日期
     */
    @Schema(description = "抄表日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @TableField("reading_date")
    private LocalDate readingDate;

    /**
     * 到期日期
     */
    @Schema(description = "到期日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @TableField("due_date")
    private LocalDate dueDate;

    /**
     * 状态（0-禁用，1-启用）
     */
    @Schema(description = "状态：0-禁用，1-启用")
    @TableField("status")
    private Integer status;

    /**
     * 备注
     */
    @Schema(description = "备注")
    @TableField("remark")
    private String remark;

    // 只包含基本的getter/setter方法，不包含任何工具方法
}
